REM > !RunImage
REM An execution scheduler.
REM  Carl Elkins & 3SL Ltd.
REM   November 1991


PROCinitWimp

ON ERROR ERROR 0,"Internal error type "+STR$ ERL+"  : "+REPORT$ :END

PROCmenus

IconHandle%=FNiconbar

terminate% =FALSE
mask%      =%10000001100100111110

granularity=60*100 :REM 60 seconds
SYS "OS_ReadMonotonicTime" TO time
time+=granularity

REPEAT
  SYS "Wimp_PollIdle",mask%,poll%,time TO action%
  CASE action% OF
    WHEN 0    : PROCprocessnull(poll%,time)
    WHEN 6    : PROCmouse(poll%)
    WHEN 9    : PROCdecodemenu(poll%)
    WHEN 17,18: PROCmessage(poll%)
  ENDCASE
UNTIL terminate%

SYS "Wimp_CloseDown"
END



DEF PROCprocessnull(blk%,RETURN time)

PROCcheckFile

SYS"OS_ReadMonotonicTime" TO newtime
WHILE (newtime - time) > 0
  time+=granularity
ENDWHILE

ENDPROC



DEF PROCmouse(blk%)
LOCAL MouseX%,MouseY%,Buttons%,Window%,Icon%

MouseX%=blk%!0:MouseY%=blk%!4:Buttons%=blk%!8
Window%=blk%!12:Icon%=blk%!16

IF Buttons%=&02 THEN
  CASE Window% OF
    WHEN -2     : SYS "Wimp_CreateMenu",,IconMenu%,MouseX%-64,96+(2*44)
  ENDCASE
ENDIF

ENDPROC



DEF PROCdecodemenu(blk%)

CASE !blk% OF
  WHEN 1 :  terminate%=TRUE
ENDCASE

ENDPROC



DEF PROCmessage(blk%)

CASE blk%!16 OF
  WHEN 0:terminate%=TRUE
ENDCASE

ENDPROC



DEF FNiconbar
LOCAL ssx%,ssy%,ssm%,B%,C%

DIM B% 15
$B%="!cron"
SYS "Wimp_SpriteOp",40,,"!cron" TO ,,,ssx%,ssy%,,ssm%
SYS "OS_ReadModeVariable",ssm%,4 TO ,,px% : ssx%=ssx%<<px%
SYS "OS_ReadModeVariable",ssm%,5 TO ,,py% : ssy%=ssy%<<py%
!q%=-1
q%!4=0
q%!8=0
q%!12=q%!4+ssx%
q%!16=q%!8+ssy%
q%!20=%00010101000000000000000100001010
q%!24=B%
q%!28=1
q%!32=LEN($B%)+1
SYS "Wimp_CreateIcon",,q% TO C%
=C%



DEF PROCmenus
DIM IconMenu% 128
$IconMenu%="CRON"
IconMenu%?12=7
IconMenu%?13=2
IconMenu%?14=7
IconMenu%?15=0
IconMenu%!16=LEN"Info"*16+12
IconMenu%!20=44
IconMenu%!24=0
IconMenu%!28=&0                         :REM  menu item 0
IconMenu%!32=W_info
IconMenu%!36=&07000001
$(IconMenu%+40)="Info"
IconMenu%!52=&80                        :REM  menu item 1
IconMenu%!56=-1
IconMenu%!60=&07000001
$(IconMenu%+64)="Quit"
ENDPROC



DEF PROCinitWimp

DIM q% &1800 ,poll% &100
DIM name% 13,IndBuf% &400
endbuf%=IndBuf%+&400
DIM t 15:$t="TASK"
SYS "Wimp_Initialise",200,!t,"Cron Utility"

SYS "Wimp_OpenTemplate",,"<Cron$dir>.Templates"

c%=0
REPEAT
  $name%="*"
  SYS "Wimp_LoadTemplate",,q%,IndBuf%,endbuf%,-1,name%,c% TO ,,IndBuf%,,,,c%
  CASE $name% OF
    WHEN "Info"    :SYS "Wimp_CreateWindow",,q% TO W_info
  ENDCASE
UNTIL c%=0

SYS "Wimp_CloseTemplate"

ENDPROC


DEF PROCcheckFile
LOCAL C%,A$,L$,mm$,hh$,dm$,my$,dw$

A$=FNtime
mm$=LEFT$(A$,2)
A$=MID$(A$,3)
hh$=LEFT$(A$,2)
A$=MID$(A$,3)
dm$=LEFT$(A$,2)
A$=MID$(A$,3)
my$=LEFT$(A$,2)
A$=MID$(A$,3)
dw$=LEFT$(A$,1)

C%=OPENIN("<Cron$Dir>.CronTab")
IF C%=0 THEN ERROR 0,"CronTab file not found."
WHILE NOT EOF#C%
  REPEAT
    A$=GET$#C%
    WHILE LEFT$(A$,1)=" "
      A$=MID$(A$,2)
    ENDWHILE
  UNTIL (LEFT$(A$,1)<>"#") OR (EOF#C%)
  IF A$<>"" THEN
    L$=A$
    IF FNmatch(mm$,hh$,dm$,my$,dw$,L$) AND (L$<>"") THEN SYS "Wimp_StartTask",L$
    IF L$="" THEN
      q%!0=255
      $(q%+4)="Bad line format in CronTab file '"+A$+"'"+CHR$(0)
      SYS "Wimp_ReportError",q%,%1,"Cron Utility"
    ENDIF
  ENDIF
ENDWHILE
CLOSE#C%

ENDPROC


DEF FNmatch(min$,hr$,dm$,my$,dow$,RETURN L$)
LOCAL A$

A$=FNnext(L$)
IF (A$=min$) OR (A$="*") THEN
  A$=FNnext(L$)
  IF (A$=hr$) OR (A$="*") THEN
    A$=FNnext(L$)
    IF (A$=dm$) OR (A$="*") THEN
      A$=FNnext(L$)
      IF (A$=my$) OR (A$="*") THEN
        A$=FNnext(L$)
        IF (A$=dow$) OR (A$="*") THEN = TRUE
      ENDIF
    ENDIF
  ENDIF
ENDIF

= FALSE


DEF FNnext(RETURN L$)
LOCAL A$,B$

B$=""
REPEAT
  A$=LEFT$(L$,1)
  L$=MID$(L$,2)
  IF A$<>" " THEN B$+=A$
UNTIL ((A$=" ") AND (LEN(B$)>0)) OR (L$="")

=B$



DEF FNtime
LOCAL R1

t?0=3
SYS "OS_Word",14,t
SYS "OS_ConvertDateAndTime",t,t,16,"%MI%24%DY%MN%WN%0"+CHR$(0) TO ,R1
R1?0=13
=$t

